node.jsアプリのデプロイにやさしい grunt-rsync
はじめに
ちょっとデプロイしてスマホで確認したい、皆に見てもらって感想が欲しい、とにかく直ぐにデプロイしたい。そんな時に便利なgrunt.js用のタスクのgrunt-rsyncです。
rsyncコマンド知ってますか?
僕は知りませんでした(汗。ファイル群の同期を取る用途のコマンドです割と古くからあるみたいです。多くのUnix系環境にデフォルトで入っているようです。名前の通り、ファイルの同期を取るのがこのコマンドの仕事で、ローカル同士でもリモートともSCP経由などで同期を取れるようです。
詳しくはWikiで。
grunt-rsyncパッケージ
rsyncwrapperというrsync用のパッケージを使用しているgrunt用タスクです。もっとシンプルにrsyncをラップしている grunt-rsync-2 というのも存在しますが、コピーに失敗してもがエラーが出なかったのでこちらの方がいいと思います。
https://github.com/jedrichards/grunt-rsync
制限としてrsyncがコピー元、コピー先どちらにも存在する必要があります。また、sshでログインする際に公開鍵認証などでパスワードが無い状態でログインできるように設定しておく必要があります。
少し設定
grunt-rsyncのインストール
$ npm install grunt-rsync
rsyncコマンドの確認
おそらくだいたい入っていますが、一応コピー元、コピー先で必要なので確認します。
$ rsync --version
.ssh/config の設定
ssh -i オプションで鍵の場所を指定しなくてもログインできるように~/.ssh/config を以下のように設定します。
host 54.248.225.1xx User loginuser port 22 Hostname 54.248.225.1xx IdentityFile ~/.ssh/hoge-key.pem IdentitiesOnly yes
接続確認
$ ssh 54.248.225.1xx
接続できれば成功です。
grunt.js の設定
gamodule.exports = function( grunt ) { 'use strict'; grunt.initConfig({ copy: { target: { files: { 'dist/': ['config/**', 'libs/**', 'models/**', 'public/**', 'routes/**', 'views/**', '*.js', '*.json'], } } }, rsync: { dist: { src: "./dist/", // コピー元ディレクトリ dest: "~/app", // コピー先ディレクトリ host: "54.248.225.1xx", // コピー先ホスト recursive: true, // 再帰的にディレクトリを走査する syncDest: true, // コピー先に存在しないファイルを削除する exclude: [".git*","*.scss"], // 除外ファイル }, } }); grunt.loadNpmTasks('grunt-rsync'); grunt.registerTask('dev', 'copy rsync'); };
こんな感じで dev という名前でタスクの設定をしました。 例ではデプロイ用にdistに一旦集めたファイルをリモートにコピーしています。
$ grunt dev
Running "rsync:dist" (rsync) task ./dist/ > 54.248.225.1xx:~/app done rsync ./dist/ 54.248.225.1xx:~/app --rsh=ssh --recursive --delete --delete-excluded --exclude=.git* --exclude=*.scss Done, without errors.
おおっ、rsyncが成功したようです。(リモート側も確認しましょう) かなり便利ですね〜。
まとめ
シェルスクリプトやJenkinsでも代用できるとは思いますが、Node.js環境での親和性の高さ、設定の簡単さなどでオススメできます。プロジェクトのはじめにこのタスクを設定して楽ちん開発しましょう。
ちなみに次期バージョンの0.4xからはCoffeeScriptで設定が書けるようなので、ますます好きになちゃいまっくすぅ〜